package com.wgy.day34.TCP文件上传练习;
/*
练习:TCP通信的文件上传
原理:客户端读取本地文件,把文件上传到服务器,服务器读取文件并把文件保存到服务器的硬盘上
分析: 1.客户端使用本地的字节输入流,读取要上传的文件
     2.客户端使用网络字节输出流,把读取到的文件上传到服务器
     3.服务器使用网络字节输入流,读取客户端上传的文件
     4.服务器使用本地字节输出流,把读取的文件保存到服务器的硬盘上
     5.服务器使用网络字节输出流,回写客户端一个"上传成功"
     6.客户端使用网络字节输入流,读取服务器回写的数据
     7.释放资源
注意:
     客户端和服务器和本地硬盘进行读写,需要使用自己创建的字节流对象(本地流)
     客户端和服务器和之间进行读写,必须使用Socket中提供的字节流对象(网络流)

文件上传客户端:读取本地的文件,上传到服务器,读取服务器回写的数据
实现步骤:1.创建一个本地字节输入流,构造方法中绑定读取要上传的数据
       2.创建一个客户端.参数传递服务器的IP地址和端口
       3.使用Socket方法中的getOutStream,获取网络字节输出流OutputStream对象
       4.使用本地字节输入流读取要上传的文件
       5.使用网络字节输出流OutputStream对象,把读取到的文件上传到服务器
       6.使用Socket方法中的getInputStream,获取网络字节输入流InputStream对象
       7.使用InputStream对象读取服务器回写的数据
       8.释放资源

*/

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

public class Demo04TestClient {
    public static void main(String[] args) throws IOException {
        //1.创建一个本地字节输入流,构造方法中绑定读取要上传的数据
        FileInputStream fis = new FileInputStream("D:\\小云\\abc\\1.jpg");
        //2.创建一个客户端.参数传递服务器的IP地址和端口
        Socket socket = new Socket("192.168.0.63",8888);
        //3.使用Socket方法中的getOutStream,获取网络字节输出流OutputStream对象
        OutputStream os = socket.getOutputStream();
        //4.使用本地字节输入流读取要上传的文件
        int len = 0;
        byte[] bytes = new byte[1024];

        while ((len = fis.read(bytes)) != -1) {
            //5.使用网络字节输出流OutputStream对象,把读取到的文件上传到服务器
            os.write(bytes, 0, len);
        }

        /* 这里就存在问题,fis.read读取要上传的文件,while循环中永远也读取不到终止符-1,那么也不会把结束标记写入到服务器
        服务器在读取客户端上传的数据的时候,由于文件没有结束标记,就会一直读取下去,后续的代码就无法执行,
        */

        /*
        解决方案:上传文件结束后,给服务器写一个结束标记
        void shutdownOutput():禁用此套接字的输出流
        对于TCP套接字,任何 之前写入的数据都将被发送,并且后跟TCP的正常连接终止序列
        */
         socket.shutdownOutput();
        //6.使用Socket方法中的getInputStream,获取网络字节输入流InputStream对象
        InputStream is = socket.getInputStream();
        //7.使用InputStream对象读取服务器回写的数据

        while ((len = is.read(bytes)) != -1) {
            System.out.println(new String(bytes,0,len));

        }
         /* 这里也存在问题,服务器在读取客户端上传的数据的时候,由于文件没有结束标记,就会一直读取下去,服务器中后续的代码就无法执行,
         也就不会执行 给客户端回写数据,所以客户端is.read()也读取不动到服务器回写的数据,客户端is.read()进入阻塞状态 后续代码无法执行
        */

        //8.释放资源
        fis.close();
        socket.close();


    }

}
